const app = getApp()
var tim=''

import TIM from 'tim-wx-sdk';
import TIMUploadPlugin from 'tim-upload-plugin';
import {genTestUserSig} from '../debug/GenerateTestUserSig';

function im_init(){
  if(app.im_globalData.isInit){
    //这里设置了一个全局变量isLogin来标记是否已登录,避免重复创建im实例
    console.log("==========my log: im is already inited==========")
    return false
  }
  let options = {
    SDKAppID: 1400645894// 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID
  };

  let that = this
  // 创建 SDK 实例，`TIM.create()`方法对于同一个 `SDKAppID` 只会返回同一份实例
  tim = TIM.create(options);// SDK 实例通常用 tim 表示
  // 设置 SDK 日志输出级别，详细分级请参见 setLogLevel 接口的说明
  tim.setLogLevel(0); // 普通级别，日志量较多，接入时建议使用
  // tim.setLogLevel(1); // release 级别，SDK 输出关键信息，生产环境时建议使用
  // 注册 COS SDK 插件
  tim.registerPlugin({'tim-upload-plugin': TIMUploadPlugin});
  // tim.registerPlugin({'cos-wx-sdk': COS})

  // 监听事件，例如：
  tim.on(TIM.EVENT.SDK_READY, function(event) {
    // 收到离线消息和会话列表同步完毕通知，接入侧可以调用 sendMessage 等需要鉴权的接口
    // event.name - TIM.EVENT.SDK_READY
    wx.event.emit('SDKReady') // 会话列表的监听函数
  });

  tim.on(TIM.EVENT.MESSAGE_RECEIVED, function(event) {
    // 收到推送的单聊、群聊、群提示、群系统通知的新消息，可通过遍历 event.data 获取消息列表数据并渲染到页面
    // event.name - TIM.EVENT.MESSAGE_RECEIVED
    // event.data - 存储 Message 对象的数组 - [Message]
    console.log('==========message received==========')
    let from = event.data[0].from
    let payload = event.data[0].payload['text']
    console.log(from +": "+payload)

    // 这里收到消息,调用setGlobalMsg方法来处理数据,传入方式标记为'received'接收消息
    setGlobalMsg(event,'received');
  });

  tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, function(event) {
    // 收到会话列表更新通知，可通过遍历 event.data 获取会话列表数据并渲染到页面
    // event.name - TIM.EVENT.CONVERSATION_LIST_UPDATED
    // event.data - 存储 Conversation 对象的数组 - [Conversation]
  });

  tim.on(TIM.EVENT.SDK_NOT_READY, function(event) {
    // 收到 SDK 进入 not ready 状态通知，此时 SDK 无法正常工作
    // event.name - TIM.EVENT.SDK_NOT_READY
  });

  tim.on(TIM.EVENT.NET_STATE_CHANGE, function(event) { 
    //  网络状态发生改变（v2.5.0 起支持）。 
    // event.name - TIM.EVENT.NET_STATE_CHANGE 
    // event.data.state 当前网络状态，枚举值及说明如下： 
    //     \- TIM.TYPES.NET_STATE_CONNECTED - 已接入网络 
    //     \- TIM.TYPES.NET_STATE_CONNECTING - 连接中。很可能遇到网络抖动，SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中” 
    //    \- TIM.TYPES.NET_STATE_DISCONNECTED - 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试，若用户网络恢复，SDK 会自动同步消息  
  });

  console.log('========== 执行了init ==========');
  app.im_globalData.isInit=true;
  // wx.event.emit('SDKReady')
  // this.login_TIM();
}

function im_login(my_userID){
  // let my_userID = 'lyc-test'
  let my_userSig = genTestUserSig(my_userID).userSig
  let promise = tim.login({userID: my_userID, userSig: my_userSig});
  promise.then(function(imResponse) {
    console.log("=========="+my_userID+" login SUCCESSFULLY==========")
    console.log(imResponse.data); // 登录成功
    if (imResponse.data.repeatLogin === true) {
      // 标识账号已登录，本次登录操作为重复登录。v2.5.1 起支持
      console.log(imResponse.data.errorInfo);
    }
  }).catch(function(imError) {
    console.warn('login error:', imError); // 登录失败的相关信息
  });
}

function im_sendMessage( sendTo , msg , type) {
  var message = ''
  if(type == 'text'){//发送文字消息
    message = tim.createTextMessage({
      to: sendTo,
      conversationType: TIM.TYPES.CONV_C2C,
      payload: {
        text: msg
      }
    });
  }else if(type == 'image'){//发送图片消息
    message = tim.createImageMessage({
      to: sendTo,
      conversationType: TIM.TYPES.CONV_C2C,
      payload: { 
        file: msg 
      },
      onProgress: function(event) { console.log('file uploading:', event) }
    });
  }else if(type == 'audio'){//发送音频消息
    message = tim.createAudioMessage({
      to: sendTo,
      conversationType: TIM.TYPES.CONV_C2C,
      payload: {
        file: msg
      }
    });
  }else if(type == 'record'){//发送咨询记录消息
    message = tim.createCustomMessage({
      to: sendTo,
      conversationType: TIM.TYPES.CONV_C2C,
      payload: {
        data: JSON.stringify(msg),
        description: 'record',
        extension: ''
      }
    });
  }
  
  let promise = tim.sendMessage(message);
  promise.then(function(imResponse) {
    // 发送成功
    console.log('发送成功')
    console.log(imResponse);
    setGlobalMsg(imResponse,'send')  //发送消息成功后调用setGlobalMsg方法来处理数据,传入方法为'send'发送消息
  }).catch(function(imError) {
    // 发送失败
    console.log('发送失败')
    console.warn('sendMessage error:', imError);
  });
}

function im_logout() {
  let promise = tim.logout();
  promise.then(function(imResponse) {
    console.log(imResponse.data); // 登出成功
  }).catch(function(imError) {
    console.warn('logout error:', imError);
  });
}

function im_getMessageList(advisorID){
  // 打开某个会话时，第一次拉取消息列表，并把获取到的列表中的消息都置为已读
  let promise = tim.getMessageList({conversationID: 'C2C'+advisorID, count: 15});
  console.log("========== start to get messageList ==========")
  promise.then(function(imResponse) {
    const messageList = imResponse.data.messageList; // 消息列表。
    const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉，分页续拉时需传入该字段。
    const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。
    console.log(imResponse)
    console.log(messageList)
    let msgarr = app.im_globalData.msg
    let conversationTo = advisorID // 定义会话键值
    if(msgarr[conversationTo] != undefined) {
      msgarr[conversationTo].concat(messageList)
    } else {
      msgarr[conversationTo] = messageList
    }
    app.im_globalData.msg = msgarr;
    wx.event.emit('renderMsgList' , msgarr[conversationTo] , nextReqMessageID , isCompleted) // 发布'renderMsg'通知页面进行对话列表初始化渲染
    
    // tim.setMessageRead({conversationID: 'C2C'+conversationTo});// 将已获取的会话消息置为已读
  });
}

function im_setMessageRead(conversationTo){
  tim.setMessageRead({conversationID: 'C2C'+conversationTo});
}

function im_getConversationList(){
  // 拉取会话列表
  let promise = tim.getConversationList();
  promise.then(function(imResponse) {
    const conversationList = imResponse.data.conversationList; // 会话列表，用该列表覆盖原有的会话列表
    console.log("========== get conversationList successfully"+" ==========")
    console.log(imResponse)
    let conversations = app.im_globalData.conversations
    conversations = imResponse.data.conversationList
    app.im_globalData.conversations = conversations
    wx.event.emit('conversationListRender', conversations)
  }).catch(function(imError) {
    console.warn('getConversationList error:', imError); // 获取会话列表失败的相关信息
  });
  
}

function setGlobalMsg(data,type) {
  //处理数据的方法
  let msgarr = app.im_globalData.msg;//初始化拉取全局数据
  let newMsgForm = '';
  if(type == 'received'){
    newMsgForm = data.data[0].from // 设置对话人
    if(msgarr[newMsgForm] != undefined) {//判断当前对话人是否有数据,如果有,就把新数据加进去,如果没有,就创一个键值对
      msgarr[newMsgForm].push(data.data[0])
    } else {
      msgarr[newMsgForm] = [data.data[0]]
    }
    app.im_globalData.msg = msgarr;
    // tim.setMessageRead({conversationID: 'C2C'+newMsgForm});// 将已获取的消息置为已读
    wx.event.emit('renderMsg' , data.data[0] , newMsgForm) // 发布'renderMsg'通知页面进行数据刷新渲染
  }else if(type == 'send'){
    newMsgForm = data.data.message.to // 设置对话人
    if(msgarr[newMsgForm] != undefined) {//判断当前对话人是否有数据,如果有,就把新数据加进去,如果没有,就创一个键值对
      msgarr[newMsgForm].push(data.data.message)
    } else {
      msgarr[newMsgForm] = [data.data.message]
    }
    app.im_globalData.msg = msgarr;
    // tim.setMessageRead({conversationID: 'C2C'+newMsgForm});// 将已获取的会话消息置为已读
    wx.event.emit('renderMsg' , data.data.message , newMsgForm)  // 发布'renderMsg'通知页面进行数据刷新渲染
  }
}

module.exports={
  im_init,
  im_login,
  im_sendMessage,
  im_logout,
  im_getMessageList,
  im_getConversationList,
  im_setMessageRead
}